/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.escom.healthlc.business;

import com.escom.healthlc.utils.Constantes;
import com.escom.healthlc.utils.PropiedadesMemoria;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 *
 * @author Carlos
 */
public class EcgBusinessRespaldo {/*
// * To change this license header, choose License Headers in Project Properties.
// * To change this template file, choose Tools | Templates
// * and open the template in the editor.
// */
//package com.escom.healthlc.business;
//
//import com.escom.healthlc.utils.Constantes;
//import com.escom.healthlc.utils.PropiedadesMemoria;
//import java.io.BufferedReader;
//import java.io.BufferedWriter;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
//import java.io.FileReader;
//import java.io.FileWriter;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.PrintWriter;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.logging.Level;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Service;
//
///**
// *
// * @author Carlos
// */
//@Service("EcgBusiness")
//public class EcgBusiness {
//
//    private static final Logger logger = LoggerFactory.getLogger(EcgBusiness.class);
//    private static final int TAMANIO_PROMEDIO_PATRON = 60;
//
//    public static void main(String[] args) throws FileNotFoundException, IOException {
//        EcgBusiness ecgBusiness = new EcgBusiness();
////        List<Double> crearListValues = ecgBusiness.crearListValues(new FileInputStream(new File("C:\\Users\\Carlos\\Dropbox\\Trabajo Terminal\\Señal\\ECG_taquicardia.txt")));
////        double[][] segmentarSenial = ecgBusiness.segmentarSenial(crearListValues, 3.6);
////        for (int i = 0; i < segmentarSenial.length; i++) {
////            for (int j = 0; j < segmentarSenial[i].length; j++) {
////                System.out.print(segmentarSenial[i][j] + "\t");
////            }
////            System.out.println("");
////        }
////        ecgBusiness.crearMemoriaAsocitiva();
//        ecgBusiness.recuperarPatron();
//    }
//
//    public List<Double> crearListValues(InputStream inputstream) throws IOException {
//        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputstream));
//        List<Double> valuesECG = new ArrayList();
//        while (bufferedReader.ready()) {
//            String readLine = bufferedReader.readLine();
//            String[] lineSplit = readLine.split(",");
//            for (int i = 0; i < lineSplit.length; i++) {
//                valuesECG.add(Double.valueOf(lineSplit[i]));
//            }
//        }
//        return valuesECG;
//    }
//
//    public double[][] segmentarSenial(List<Double> senialList, double lineDelimiter) {
//        /*Calcula puntos maximos*/
//        List<Integer> xPtMaximo = new ArrayList<Integer>();
//        for (int i = 0; i < senialList.size(); i++) {
//            Double value = senialList.get(i);
//            if (value > lineDelimiter) {
//                xPtMaximo.add(i);
//            }
//        }
//        /*Calcular en base dos Pts maximos el punto medio de la señal*/
//        List<Integer> xPtMedio = new ArrayList<Integer>();
//        List<Integer> tamanioPatron = new ArrayList<Integer>();
//        for (int i = 0; i < xPtMaximo.size() - 1; i++) {
//            xPtMedio.add(((xPtMaximo.get(i + 1) - xPtMaximo.get(i)) / 2) + xPtMaximo.get(i));
//            tamanioPatron.add(xPtMaximo.get(i + 1) - xPtMaximo.get(i));
//        }
//        xPtMedio.add(senialList.size() - 1);
//
//        /*Obtener segmentos del patron*/
//        double[][] patrones = new double[xPtMedio.size()][TAMANIO_PROMEDIO_PATRON];//NOTA FALTA
//        for (int i = 0; i < xPtMedio.size(); i++) {
//            /*Segmentos de la señal en base al inico hasta el punto medio ITERATIVO*/
//            List<Double> segmentoSenial = senialList.subList((i > 0) ? xPtMedio.get(i - 1) : 0, xPtMedio.get(i));
//            List<Double> copySegmento = null;
//            //Interpolacion y Diezmado
//            while (segmentoSenial.size() != 60) {
//                int sizeSegmentoSenial = segmentoSenial.size();
//                if (sizeSegmentoSenial < TAMANIO_PROMEDIO_PATRON) {
//                    copySegmento = funcionInterpolacion(segmentoSenial);
//                } else if (sizeSegmentoSenial > TAMANIO_PROMEDIO_PATRON) {
//                    copySegmento = funcionDiezmado(segmentoSenial);
//                }
//                segmentoSenial = copySegmento;
//            }
////            System.out.println("segmentoSenial: " + segmentoSenial.size());
//            for (int k = 0; k < segmentoSenial.size(); k++) {
//                patrones[i][k] = segmentoSenial.get(k);
//            }
//
//        }
//        return patrones;
//    }
//
//    public List<Double> funcionDiezmado(List<Double> patron) {
//        int sizePatron = patron.size();
//        List<Double> copiPatron = new ArrayList<Double>();
//        int muestrasSobrantes = sizePatron - TAMANIO_PROMEDIO_PATRON;
//        int factorDiezmado = (int) Math.floor(sizePatron / muestrasSobrantes);
//        if (factorDiezmado >= sizePatron) {
//            factorDiezmado--;
//        }
//        for (int i = 0; i < patron.size(); i++) {
//            if (i == 0 || (i % factorDiezmado) != 0) {
//                copiPatron.add(patron.get(i));
//            }
//        }
//        return copiPatron;
//    }
//
//    public List<Double> funcionInterpolacion(List<Double> patron) {
//        List<Double> copiPatron = new ArrayList<Double>();
//        int sizePatron = patron.size();
//        int muestrasFaltantes = TAMANIO_PROMEDIO_PATRON - sizePatron;
//        int factorInterpolacion = (int) Math.rint(sizePatron / muestrasFaltantes);
//        if (factorInterpolacion >= sizePatron) {
//            factorInterpolacion--;
//        }
//        int j = 0;
//        if (factorInterpolacion > 1) {
////            System.out.println("Caso 1");
//            for (int i = 0; j < patron.size(); i++) {
//                if ((i % factorInterpolacion) != 0) {
//                    copiPatron.add(patron.get(j));
//                    j++;
//                } else {
//                    if ((j - 1) < 0) {
//                        copiPatron.add(patron.get(j));
//                        j++;
//                    } else {
//                        Double bottom = patron.get(j - 1);
//                        Double top = patron.get(j);
//                        copiPatron.add(Math.abs((top + bottom) / 2));
//                    }
//                }
//            }
//        } else if (factorInterpolacion <= 1) {
////            System.out.println("Caso 2");
//            muestrasFaltantes = (int) Math.rint((TAMANIO_PROMEDIO_PATRON / sizePatron));
//            int i = 0;
//            while (j + 1 < patron.size()) {
//                Double bottom = patron.get(j);
//                Double top = patron.get(j + 1);
//                double valorResta = Math.abs(top - bottom);
//                double factorInterpolacionDouble = valorResta / (muestrasFaltantes);
//                if (top > bottom) {
//                    copiPatron.add(bottom);
//                    for (int k = 0; k < muestrasFaltantes - 1; k++) {
//                        copiPatron.add(bottom + (factorInterpolacionDouble * (k + 1)));
//                    }
//                } else {
//                    copiPatron.add(bottom);
//                    for (int k = 0; k < muestrasFaltantes - 1; k++) {
//                        copiPatron.add(bottom - (factorInterpolacionDouble * (k + 1)));
//                    }
//                }
//                j++;
//            }
//        }
////        System.out.println("copiPatron.size(): " + copiPatron.size());
//        return copiPatron;
//    }
//
//    public void salvarSegmentos(double[][] segmentosSenial, int[] opcTipoArritmiaArray) {
//        try {
//            PrintWriter printWriter = new PrintWriter(new FileWriter(new File(Constantes.PATH_WEB_VIRTUAL) + "\\PatronesECG.txt", true));
//            String line;
//            for (int i = 0; i < segmentosSenial.length; i++) {
//                line = "";
//                for (int j = 0; j < segmentosSenial[i].length; j++) {
//                    line += segmentosSenial[i][j] + " ";
//                }
//                line += opcTipoArritmiaArray[i];
//                printWriter.println(line);
//            }
//            printWriter.close();
//        } catch (IOException ex) {
//            logger.error("Error Logger: {}", ex.getCause().getMessage());
//            logger.error("Error Logger: {}", ex.fillInStackTrace().toString());
//        }
//    }
//
//    public void crearMemoriaAsocitiva() {
//        try {
//            List<String> clasesValidas;
//            PropiedadesMemoria propiedadesMemoria;
//            for (int i = 0; i < 3; i++) {
//                propiedadesMemoria = new PropiedadesMemoria();
//                double[] vectorMedio;
//                double[][] patronesAllMatriz;
//                double[][] patronesTrasladoAllMatriz;
//                double[][] memoriaMatriz;
//                File fileRouthIn,
//                        fileRouthPatronesTrasladadosTaquicardia, fileRouthPatronesTrasladadosBradicardia,
//                        fileRouthMemoriaTaquicardia, fileRouthMemoriaBradicardia, fileRouthMemoriaFibrilacion,
//                        fileRouthVectorMedioTaquicardia, fileRouthVectorMedioBradicardia, fileRouthVectorMedioFibrilacion;
//                fileRouthIn = new File(Constantes.PATH_WEB_VIRTUAL + "\\PatronesECG.txt");
//                fileRouthPatronesTrasladadosTaquicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\PatronesTrasladadosTaquicardia.txt");
//                fileRouthPatronesTrasladadosBradicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\PatronesTrasladadosBradicardia.txt");
//                fileRouthMemoriaTaquicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\MemoriaTaquicardia.txt");
//                fileRouthMemoriaBradicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\MemoriaBradicardia.txt");
//                fileRouthMemoriaFibrilacion = new File(Constantes.PATH_WEB_VIRTUAL + "\\MemoriaFibrilacion.txt");
//                fileRouthVectorMedioTaquicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\VectorMedioTaquicardia.txt");
//                fileRouthVectorMedioBradicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\VectorMedioBradicardia.txt");
//                fileRouthVectorMedioFibrilacion = new File(Constantes.PATH_WEB_VIRTUAL + "\\VectorMedioFibrilacion.txt");
//
//                clasesValidas = new ArrayList<String>();
//                clasesValidas.add("0");
//                clasesValidas.add(String.valueOf(i + 1));
//
//                propiedadesMemoria.initData(new BufferedReader(new FileReader(fileRouthIn)), clasesValidas);
//                patronesAllMatriz = propiedadesMemoria.ExtraccionPatrones(new BufferedReader(new FileReader(fileRouthIn)), clasesValidas);
//
//                vectorMedio = propiedadesMemoria.CalcularVectorMedio(patronesAllMatriz);
//                if (i == 0) {
//                    propiedadesMemoria.EscribirArreglo(vectorMedio,
//                            new BufferedWriter(new FileWriter(fileRouthVectorMedioTaquicardia)));
//                } else if (i == 1) {
//                    propiedadesMemoria.EscribirArreglo(vectorMedio,
//                            new BufferedWriter(new FileWriter(fileRouthVectorMedioBradicardia)));
//                } else if (i == 2) {
//                    propiedadesMemoria.EscribirArreglo(vectorMedio,
//                            new BufferedWriter(new FileWriter(fileRouthVectorMedioFibrilacion)));
//
//                }
//
//                patronesTrasladoAllMatriz = propiedadesMemoria.CalcularPatronesTrasladados(patronesAllMatriz, vectorMedio);
////                if (i == 0) {
////                    propiedadesMemoria.EscribirMatriz(patronesTrasladoAllMatriz,
////                            new BufferedWriter(new FileWriter(fileRouthPatronesTrasladadosTaquicardia, true)));
////                } else if (i == 1) {
////                    propiedadesMemoria.EscribirMatriz(patronesTrasladoAllMatriz,
////                            new BufferedWriter(new FileWriter(fileRouthPatronesTrasladadosBradicardia, true)));
////                }
//
//                memoriaMatriz = propiedadesMemoria.CalcularMemoria(patronesTrasladoAllMatriz);
//                if (i == 0) {
//                    propiedadesMemoria.EscribirMatriz(memoriaMatriz,
//                            new BufferedWriter(new FileWriter(fileRouthMemoriaTaquicardia)));
//                } else if (i == 1) {
//                    propiedadesMemoria.EscribirMatriz(memoriaMatriz,
//                            new BufferedWriter(new FileWriter(fileRouthMemoriaBradicardia)));
//                } else if (i == 2) {
//                    propiedadesMemoria.EscribirMatriz(memoriaMatriz,
//                            new BufferedWriter(new FileWriter(fileRouthMemoriaFibrilacion)));
//                }
//                System.out.println("");
//                propiedadesMemoria.RecuperacionData(patronesTrasladoAllMatriz, memoriaMatriz);
//                System.out.println(propiedadesMemoria.getEficienciaTotal() + "");
//            }
//        } catch (IOException ex) {
//            logger.error("Error Logger: {}", ex.getCause().getMessage());
//            logger.error("Error Logger: {}", ex.fillInStackTrace().toString());
//        }
//    }
//
////    public void recuperarPatron(double[][] patronRecuperar) {
//    public void recuperarPatron() {
//        try {
//            List<String> clasesValidas;
//            PropiedadesMemoria propiedadesMemoria;
//            propiedadesMemoria = new PropiedadesMemoria();
//            double[] vectorMedio = null;
//            double[][] patronesTrasladoAllMatriz;
//            double[][] memoriaMatriz = null;
//            File fileRouthIn,
//                    fileRouthPatronesTrasladadosTaquicardia, fileRouthPatronesTrasladadosBradicardia,
//                    fileRouthMemoriaTaquicardia, fileRouthMemoriaBradicardia, fileRouthMemoriaFibrilacion,
//                    fileRouthVectorMedioTaquicardia, fileRouthVectorMedioBradicardia, fileRouthVectorMedioFibrilacion;
//            fileRouthIn = new File(Constantes.PATH_WEB_VIRTUAL + "\\PatronesECG.txt");
//            fileRouthPatronesTrasladadosTaquicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\PatronesTrasladadosTaquicardia.txt");
//            fileRouthPatronesTrasladadosBradicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\PatronesTrasladadosBradicardia.txt");
//            fileRouthMemoriaTaquicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\MemoriaTaquicardia.txt");
//            fileRouthMemoriaBradicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\MemoriaBradicardia.txt");
//            fileRouthMemoriaFibrilacion = new File(Constantes.PATH_WEB_VIRTUAL + "\\MemoriaFibrilacion.txt");
//            fileRouthVectorMedioTaquicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\VectorMedioTaquicardia.txt");
//            fileRouthVectorMedioBradicardia = new File(Constantes.PATH_WEB_VIRTUAL + "\\VectorMedioBradicardia.txt");
//            fileRouthVectorMedioFibrilacion = new File(Constantes.PATH_WEB_VIRTUAL + "\\VectorMedioFibrilacion.txt");
//
//            double[][] patronRecuperar = propiedadesMemoria.LeerPatronesTrasladados(new BufferedReader(new FileReader(fileRouthPatronesTrasladadosTaquicardia)));
//
//            List<String> clasificarPatronesTaquicardia = new ArrayList<String>();
//            List<String> clasificarPatronesBradicardia = new ArrayList<String>();
//            List<String> clasificarPatronesFibrilacion = new ArrayList<String>();
//            List<String> claseRecuperada = new ArrayList<String>();
//
//            for (int k = 0; k < 3; k++) {
//                if (k == 0) {
//                    vectorMedio = propiedadesMemoria.LeerVectorMedio(new BufferedReader(new FileReader(fileRouthVectorMedioTaquicardia)));
//                } else if (k == 1) {
//                    vectorMedio = propiedadesMemoria.LeerVectorMedio(new BufferedReader(new FileReader(fileRouthVectorMedioBradicardia)));
//                } else if (k == 2) {
//                    vectorMedio = propiedadesMemoria.LeerVectorMedio(new BufferedReader(new FileReader(fileRouthVectorMedioFibrilacion)));
//                }
//
//                patronesTrasladoAllMatriz = propiedadesMemoria.CalcularPatronesTrasladadosTesting(patronRecuperar, vectorMedio);
//
//                if (k == 0) {
//                    memoriaMatriz = propiedadesMemoria.LeerMemoria(new BufferedReader(new FileReader(fileRouthMemoriaTaquicardia)));
//                } else if (k == 1) {
//                    memoriaMatriz = propiedadesMemoria.LeerMemoria(new BufferedReader(new FileReader(fileRouthMemoriaBradicardia)));
//                } else if (k == 2) {
//                    memoriaMatriz = propiedadesMemoria.LeerMemoria(new BufferedReader(new FileReader(fileRouthMemoriaFibrilacion)));
//                }
//
//                if (k == 0) {
//                    clasificarPatronesTaquicardia = propiedadesMemoria.ClasificarPatrones(patronesTrasladoAllMatriz, memoriaMatriz);
//                } else if (k == 1) {
//                    clasificarPatronesBradicardia = propiedadesMemoria.ClasificarPatrones(patronesTrasladoAllMatriz, memoriaMatriz);
//                } else if (k == 2) {
//                    clasificarPatronesFibrilacion = propiedadesMemoria.ClasificarPatrones(patronesTrasladoAllMatriz, memoriaMatriz);
//                }
//            }
//
//            for (int i = 0; i < clasificarPatronesTaquicardia.size(); i++) {
//                System.out.println(clasificarPatronesTaquicardia.get(i));
//            }
//            System.out.println("");
//            for (int i = 0; i < clasificarPatronesBradicardia.size(); i++) {
//                System.out.println(clasificarPatronesBradicardia.get(i));
//            }
//            System.out.println("");
//            for (int i = 0; i < clasificarPatronesFibrilacion.size(); i++) {
//                System.out.println(clasificarPatronesFibrilacion.get(i));
//            }
//            System.out.println("");
//
//            for (int i = 0; i < clasificarPatronesTaquicardia.size(); i++) {
//                String taquicardia = clasificarPatronesTaquicardia.get(i);
//                String bradicardia = clasificarPatronesBradicardia.get(i);
//                String fibrilacion = clasificarPatronesFibrilacion.get(i);
//                String[] splitTaquicardia = taquicardia.split(",");
//                String[] splitBradicardia = bradicardia.split(",");
//                String[] splitFibrilacion = fibrilacion.split(",");
//                double valorTaquicardia = Double.valueOf(splitTaquicardia[1]);
//                double valorBradicardia = Double.valueOf(splitBradicardia[1]);
//                double valorFibrilacion = Double.valueOf(splitFibrilacion[1]);
//                double claseTaquicardia = Double.valueOf(splitTaquicardia[0]);
//                double claseBradicardia = Double.valueOf(splitBradicardia[0]);
//                double claseFibrilacion = Double.valueOf(splitFibrilacion[0]);
//                if (valorTaquicardia > valorBradicardia) {
//                    if (valorTaquicardia > valorFibrilacion) {
//                        if (claseTaquicardia == 0) {
//                            claseRecuperada.add("0");
//                        } else {
//                            claseRecuperada.add("1");
//                        }
//                    } else {
//                        if (claseTaquicardia == 0) {
//                            claseRecuperada.add("0");
//                        } else {
//                            claseRecuperada.add("3");
//                        }
//                    }
//                } else if (valorBradicardia > valorFibrilacion) {
//                    if (claseTaquicardia == 0) {
//                        claseRecuperada.add("0");
//                    } else {
//                        claseRecuperada.add("2");
//                    }
//                } else {
//                    if (claseTaquicardia == 0) {
//                        claseRecuperada.add("0");
//                    } else {
//                        claseRecuperada.add("3");
//                    }
//
//                }
//            }
//
//            for (int j = 0; j < claseRecuperada.size(); j++) {
//                System.out.println("Valor: " + j + " " + claseRecuperada.get(j));
//            }
//
//        } catch (IOException ex) {
//            java.util.logging.Logger.getLogger(EcgBusiness.class.getName()).log(Level.SEVERE, null, ex);
//
////            logger.error("Error Logger: {}", ex.getCause().getMessage());
////            logger.error("Error Logger: {}", ex.fillInStackTrace().toString());
//        }
//
//    }
//
//}
    
}
